package com.lihepeng.leecode.slip_window;


import java.util.Arrays;

/**
 * 给你两个字符串 s1 和 s2 ，写一个函数来判断 s2 是否包含 s1 的排列。如果是，返回 true ；否则，返回 false 。
 *
 * 换句话说，s1 的排列之一是 s2 的 子串 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/permutation-in-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution567 {

    public boolean checkInclusion(String s1, String s2) {
        int n = s1.length();
        int m = s2.length();
        //使用固定长度为 n 的字符  如果两个数组的内容完全一致 则返回true
        if (n >m) {
            return false;
        }
        int [] cnt1 = new int[26];
        int [] cnt2 = new int[26];
        for (int i =0;i<s1.length();i++) {
            ++cnt1[s1.charAt(i)-'1'];
            ++cnt2[s2.charAt(i)-'1'];
        }

        if (Arrays.equals(cnt1,cnt2)) {
            return true;
        }

        for (int i=n;i<m;i++) {
            ++cnt2[s2.charAt(i)-'a'];
            --cnt2[s2.charAt(i-n)-'a'];
            if (Arrays.equals(cnt1,cnt2)) {
                return true;
            }

        }
        return false;
    }

    /**
     * 移动一个 字符却要比较 两个数组 优化
     * 记录一个 diff  每次移动 记录一进一出 两个字符xy 如果
     * @param s1
     * @param s2
     * @return
     */
    public boolean checkInclusion1(String s1, String s2) {
        int n = s1.length();
        int m = s2.length();
        //使用固定长度为 n 的字符  如果两个数组的内容完全一致 则返回true
        if (n >m) {
            return false;
        }
        int [] cnt = new int[26];
        for (int i=0;i<n;i++) {
            --cnt[s1.charAt(i)-'a'];
            ++cnt[s2.charAt(i)-'a'];
        }
        int diff =0;
        for (int i=0;i<cnt.length;i++) {
            if (cnt[i]!=0) {
                diff++;
            }
        }
        if (diff ==0) {
            return true;
        }

        for (int i=n ;i<m ;i++) {
            int x = s2.charAt(i)-'a';
            int y = s2.charAt(i-n)-'a';
            if (cnt[x] == 0) {
                ++diff;
            }
            ++cnt[x];
            if (cnt[x] == 0) {
                --diff;
            }
            if (cnt[y] == 0) {
                ++diff;
            }
            --cnt[y];
            if (cnt[y] == 0) {
                --diff;
            }
            if (diff == 0) {
                return true;
            }


        }
        return false;
    }


    public boolean checkInclusion2(String s1, String s2) {
        
        return false;
    }
}
